#define _CRT_SECURE_NO_WARNINGS 1

#include "Stack.h"

namespace bit
{
	void STInit(ST* ps, int n)
	{
		assert(ps);

		ps->a = (STDataType*)malloc(n * sizeof(STDataType));
		ps->top = 0;
		ps->capacity = n;
	}

	void STDestroy(ST* ps)
	{
		assert(ps);

		free(ps->a);
		ps->a = NULL;
		ps->top = ps->capacity = 0;
	}

	//栈顶
	void STPush(ST* ps, STDataType x)
	{
		assert(ps);

		//满了，扩容
		if (ps->top == ps->capacity)
		{
			int newcapacity = 0 == ps->capacity ? 4 : 2 * ps->capacity;
			STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));

			if (NULL == tmp)
			{
				perror("realloc fail");
				return;
			}

			ps->a = tmp;
			ps->capacity = newcapacity;
		}

		ps->a[ps->top] = x;
		ps->top++;
	}

	void STPop(ST* ps)
	{
		assert(ps);
		assert(!STEmpty(ps));

		ps->top--;
	}

	STDataType STTop(ST* ps)
	{
		assert(ps);
		assert(!STEmpty(ps));

		return ps->a[ps->top - 1];
	}

	int STSize(ST* ps)
	{
		assert(ps);

		return ps->top;
	}

	bool STEmpty(ST* ps)
	{
		assert(ps);

		return 0 == ps->top;
	}
}